package com.ruoyi.yf.tool.barcode;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.file.FileWriter;
import cn.hutool.core.util.ZipUtil;
import cn.hutool.extra.qrcode.QrCodeUtil;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.yf.config.BarcodeConfig;
import org.jbarcode.util.ImageUtil;
import com.ruoyi.common.json.JSONObject;

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * 生成条形码文件
 */
public class GenerateBarcode {

    /**
     * 密码验证 生成条形码、
     * * @param generateBarcode 配置文件
     * * @param path            文件路径
     * * @param creatbyname     创建者
     *
     * @param passwprd 密码
     *                 * @return zip文件路径
     */
    @Log(title = "生成条形码文件-密码验证", businessType = BusinessType.CODE_FILE)
    public static JSONObject generate(BarcodeConfig generateBarcode, String path, String creatbyname, String passwprd) {
        if (generateBarcode.getPassword() != null && generateBarcode.getPassword().equals(passwprd))
            return generate(generateBarcode, path, creatbyname);
        else
            return resultObj("1004", "生成条码验证码不正确");
    }

    //生成单个条码/二维码
    public static String genrateBrAndQr(BarcodeConfig generateBarcode) {

        String barcode = new Rules().barcode(true);
//        JbarcodeUtil.createBarcode(barcode, new File(files + barcode + "." + ImageUtil.PNG), "");
        return "";
    }


    /**
     * 生成条形码，
     *
     * @param generateBarcode 配置文件
     * @param path            文件路径
     * @param creatbyname     创建者
     * @return zip文件路径
     */
    @Log(title = "生成条形码文件", businessType = BusinessType.CODE_FILE)
    public static JSONObject generate(BarcodeConfig generateBarcode, String path, String creatbyname) {

        //返回路径
        String result = null;

        if (generateBarcode.getCodeno() < 1) {
            return resultObj("1002", "Bar code less than 1");
        }
        if (generateBarcode.getfileno() > generateBarcode.getCodeno()) {
            return resultObj("1003", "The number of generated files is greater than the number of bar codes!(生成文件个数大于条码个数)");
        }
        System.out.println("生成code文件：" + generateBarcode);
        //
        if (generateBarcode.isIsqrcode() || generateBarcode.isIsbrcode() || generateBarcode.isIstext()) {
            int count = generateBarcode.getCodeno();
            List<String> str = new ArrayList<>();

            //新文件夹
            String newFilePaht = path +File.separator+ getFileName("yyyyMMddHHmm") + "_" + creatbyname + File.separator;

            //生成文件夹次数
            int index = 1;

            while (count > 0) {
                String barcode = new Rules().barcode(true);
                str.add(barcode);

                //生成二维码文件
                if (generateBarcode.isIsqrcode()) {
                    //二维码 文件夹路径
                    String files = newFilePaht + File.separator + "qr" + File.separator + index + File.separator;
                    FileUtil.mkdir(files);
                    QrCodeUtil.generate(barcode, generateBarcode.getQrConfig(), FileUtil.file(files + barcode + "." + ImageUtil.PNG));
                }

                //生成条码文件
                if (generateBarcode.isIsbrcode()) {
                    //二维码 文件夹路径
                    String files = newFilePaht + File.separator + "br" + File.separator + index + File.separator;
                    FileUtil.mkdir(files);
                    JbarcodeUtil.createBarcode(barcode, new File(files + barcode + "." + ImageUtil.PNG), "");
                }

                count--;
                if (generateBarcode.getfileno() == str.size()) {
                    //生成txt
                    if (generateBarcode.isIstext()) {
                        generateTxt(StringUtils.join(str.toArray(), "\r\n"), newFilePaht + File.separator + "txt" + File.separator + getFileName("HHmmssSSS") + "_" + index + ".txt");
                    }
                    index++;
                    str = new ArrayList<>();
                }
            }
            // 生成txt
            if (str.size() > 0) {
                if (generateBarcode.isIstext()) {
                    generateTxt(StringUtils.join(str.toArray(), "\r\n"), newFilePaht + File.separator + "txt" + File.separator + getFileName("HHmmssSSS") + "_" + index + ".txt");
                }
            }

            //文件夹压缩
            if (newFilePaht != null) {
                System.out.println("压缩文件：" + newFilePaht);
                File zip = ZipUtil.zip(newFilePaht);
                if (zip.exists()) {//生成zip文件、判断文件是否存在
                    FileUtil.del(newFilePaht);//删除源文件夹
//                    result = zip.getAbsolutePath();
                    result = zip.getName();
                }
            }
        }
        System.out.println("生成文件：" + result);
        return resultObj("1000", "生成成功", result);
    }

    /**
     * 当前 时间 字符串
     *
     * @param format 格式化
     * @return
     */
    private static String getFileName(String format) {
        return new SimpleDateFormat(format).format(new Date());
    }


    //生成txt文件
    public static String generateTxt(String str, String path) {
        System.out.println(path);
        FileWriter f = new FileWriter(path);
        f.write(str);
//        System.out.println(path + ">>>" + str);
        return null;
    }

    /**
     * 获取每个文件下条码个数
     *
     * @param fileNumber
     * @param codeNo
     * @return
     */
    public static int getFileCodeNo(int fileNumber, int codeNo) {
        return fileNumber % codeNo == 0 ? (fileNumber / codeNo) : (fileNumber / codeNo) + 1;
    }

    //返回参数状态
    public static JSONObject resultObj(String code, String msg) {
        JSONObject res = new JSONObject();
        res.put("code", code);
        res.put("msg", msg);
        return res;
    }

    //返回参数状态
    public static JSONObject resultObj(String code, String msg, String path) {
        JSONObject res = new JSONObject();
        res.put("code", code);
        res.put("msg", msg);
        res.put("path", path);
        return res;
    }

}
